package dca.sistemascontrole.driver;

import br.ufrn.dca.controle.QuanserClient;
import br.ufrn.dca.controle.QuanserClientException;
import dca.sistemascontrole.exception.LogManager;
import dca.sistemascontrole.exception.QuarserClientNullException;
import dca.sistemascontrole.util.ControleConstantes;
import dca.sistemascontrole.util.XMLManager;
import java.io.FileNotFoundException;
import java.io.IOException;

/**
 *
 * @author Rafael
 */
public class GerenciadorComunicacao {

    private ServerConfig serverConfig;
    private QuanserClient quanserClient;

    public double readTanqueSuperior() throws QuanserClientException, QuarserClientNullException {
        if (quanserClient != null && serverConfig != null) {
            return quanserClient.read(serverConfig.getCanalTanqueSuperior()) * ControleConstantes.CONVERSAO;
        } else {
            throw new QuarserClientNullException("Comunicação inexistente.");
        }
    }

    public double readTanqueInferior() throws QuanserClientException, QuarserClientNullException {
        if (quanserClient != null && serverConfig != null) {
            return quanserClient.read(serverConfig.getCanalTanqueInferior()) * ControleConstantes.CONVERSAO;
        } else {
            throw new QuarserClientNullException("Comunicação inexistente.");
        }
    }

    public double escreverValor(double valorEscrita) throws QuanserClientException, QuarserClientNullException {
        if (valorEscrita > 3) {
            valorEscrita = 3;
        } else if (valorEscrita < -3) {
            valorEscrita = -3;
        }
        if (quanserClient != null && serverConfig != null) {
            quanserClient.write(serverConfig.getCanalBomba(), valorEscrita);
        } else {
            throw new QuarserClientNullException("Comunicação inexistente.");
        }

        return valorEscrita;
    }

    public void haltComunicacao() {
        quanserClient = null;
        serverConfig = null;
    }

    public void reloadService(ServerConfig serverConfig) throws QuanserClientException {
        this.serverConfig = serverConfig;

        setQuarserClient(serverConfig);

        try {
            XMLManager.writeObject(serverConfig, ControleConstantes.FILE_ROOT + ControleConstantes.FILE_CONFIGURACAO);
        } catch (FileNotFoundException ex) {
            LogManager.logErro(ex, "Não foi possível salvar a configuração das portas.");
        } catch (IOException ex) {
            LogManager.logErro(ex, "Não foi possível salvar a configuração das portas.");
        }
    }

    private void setQuarserClient(ServerConfig serverConfig) throws QuanserClientException {
        if (serverConfig != null) {
            quanserClient = new QuanserClient(serverConfig.getHost(), serverConfig.getPorta());
        } else {
            quanserClient = null;
        }
    }
}
